#include <iostream>
#include <string>
#include <unordered_set>
#include <algorithm>

using namespace std;

/**
 * 生成所有循环排列（rotations）
 * @param num 输入数字字符串
 * @return 所有循环排列组成的集合
 */
unordered_set<string> generateRotations(const string& num) {
    unordered_set<string> rotations;
    int n = num.size();

    // 循环n次，每次将字符串旋转i位
    for (int i = 0; i < n; ++i) {
        // 将字符串从第i位开始截取，并拼接前面的部分
        string rotated = num.substr(i) + num.substr(0, i);
        rotations.insert(rotated);  // 插入到集合中
    }

    return rotations;
}

/**
 * 模拟大数乘法：字符串 × 整数
 * @param num 输入数字字符串
 * @param multiplier 乘数（1~n）
 * @return 乘积结果的字符串形式
 */
string multiplyString(const string& num, int multiplier) {
    int carry = 0;
    string result;

    // 从后往前逐位相乘
    for (int i = num.size() - 1; i >= 0; --i) {
        int digit = (num[i] - '0') * multiplier + carry;
        result.push_back((digit % 10) + '0');  // 当前位保留个位数
        carry = digit / 10;                    // 记录进位
    }

    // 处理最后可能存在的进位
    while (carry > 0) {
        result.push_back((carry % 10) + '0');
        carry /= 10;
    }

    // 因为我们是从低位往高位存储的，所以结果要反转
    reverse(result.begin(), result.end());

    return result;
}
int main() {
    string num;
    cin >> num;

    size_t n = num.size();                // ← 修改为 size_t
    auto rotations = generateRotations(num);

    bool isCyclic = true;

    for (size_t i = 1; i <= n; ++i) {      // i 也建议使用 size_t
        string product = multiplyString(num, i);

        if (product.size() != n) {
            isCyclic = false;
            break;
        }

        if (rotations.find(product) == rotations.end()) {
            isCyclic = false;
            break;
        }
    }

    cout << (isCyclic ? "Yes" : "No") << endl;
    return 0;
}